home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 4
/
FM Towns Free Software Collection 4 - Disc 1.iso
/
pao
/
towns
/
paolib
/
sample
/
type.c
< prev
next >
Wrap
Text File
|
1991-10-18
|
7KB
|
244 lines
/** << High C >> **************************************************************
**
** テキスト画面出力テストプログラム(INT23h/INT24h処理を含む)
**
** < History >
** 1991.03.06 : CREATE
** 1991.05.07 : CTRL+C,致命的エラー時の処理追加。
**
** < note > : TABS = 4
**
** Programmed by Y.Hirata ( Nifty ID : NAB03321 )
**
******************************************************************************/
pragma Off (Floating_point) ;
#include <stdio.h>
#include <dos.h>
#include <msdos.cf>
#include <egb.h>
#include <stdlib.h>
#include <string.h>
#include <fmc.h>
#include "hc.h"
#include "key.h"
#include <stdefs.h>
#include "doserror.h"
#define GworkSize 1536 /* グラフィック作業域のサイズ */
char Gwork[GworkSize] ; /* グラフィック作業域 */
/******************************* 致命的エラー処理 *****************************/
static int critical_handler( unsigned di,unsigned ax )
/*=============================================================================
** 致命的エラーが発生した場合の処理をする.
**
** < INPUT > : di エラーコード(下位1バイトだけ有効)
** : ax 他のデバイスのエラーコード
** < OUTPUT > : なし
** < RETURN > : 致命的エラーに対する処置
**
** ☆ 注意 ☆
** 致命的エラー処理を行うハンドラでは、必ず次の値のいずれかを返り値とすること!
** INT24_IGNORE 0 ( 無視 )
** INT24_RETRY 1 ( 再試行 )
** INT24_ABORT 2 ( プログラム中止 )
** INT24_FAIL 3 ( ファンクションコール失敗 )
** ●実際には、再試行(INT24_RETRY)か取消(INT24_FAIL)のどちらかを返り値とした
** 方がよい。無視(INT24_IGNORE)の場合には、その後の処理が保証されないし、
** 中止(INT24_ABORT)の場合には、終了処理しないでプログラムが終了してしまうた
** めにOSに戻った後の処理が保証されないため。
** ●ただ単にマスクしたいのであれば、アクセス失敗という意味でINT24_FAILを返り値とす
** る。
** ●無条件に再試行をするようにする場合には、必ずwaitをいれるようにすること!
=============================================================================*/
{
register int act ;
int errcode ;
struct _ENCODE encode ;
union _MOJI moji ;
/*
** 致命的エラー発生時のメッセージ表示
*/
TEXT_cr() ;
TEXT_color( C_WHITE ) ;
if ( (ax & 0x8000) == 0x8000 ) {
TEXT_printf( "↓のキャラクタデバイスにエラーの原因があります.\n" ) ;
switch ( ax & 0x000f ) {
case 1 :
TEXT_printf( "標準入力\n" ) ;
break ;
case 2 :
TEXT_printf( "標準出力\n" ) ;
break ;
case 4 :
TEXT_printf( "NULデバイス\n" ) ;
break ;
case 8 :
TEXT_printf( "クロックデバイス\n" ) ;
break ;
default :
TEXT_printf( "不明: AX = %xh\n",ax ) ;
}
} else {
TEXT_printf( "ブロックデバイス : FATのメモリイメージにエラーの原因があります.\n" ) ;
}
TEXT_cr() ;
/* エラーコード表示 */
errcode = di & 0x00ff ;
if ( errcode > NDOSerr_code_msg || errcode < 0 ) {
errcode = NDOSerr_code_msg ;
TEXT_printf( "エラーコード(%d): %s\n",
(di&0x00ff),DOSerr_code_msg[errcode] ) ;
} else {
TEXT_printf( "エラーコード(%d): %s\n",
errcode,DOSerr_code_msg[errcode] ) ;
}
/*
** 致命的エラー発生時の詳細情報表示
*/
TEXT_cr() ;
TEXT_color( C_GREEN ) ;
/* 詳細情報 : 拡張エラーコード */
errcode = INT24err.exterror ;
if ( errcode > NDOSerr_extcode_msg || errcode < 0 ) {
errcode = NDOSerr_extcode_msg ;
TEXT_printf( "拡張エラーコード(%2d): %s\n",
INT24err.exterror,DOSerr_extcode_msg[errcode] ) ;
} else {
TEXT_printf( "拡張エラーコード(%2d): %s\n",
errcode,DOSerr_extcode_msg[errcode] ) ;
}
/* 詳細情報 : エラークラス */
errcode = INT24err.class ;
if ( errcode > NDOSerr_class_msg || errcode < 0 ) {
errcode = NDOSerr_class_msg ;
TEXT_printf( " エラークラス (%2d): %s\n",
INT24err.class,DOSerr_class_msg[errcode] ) ;
} else {
TEXT_printf( " エラークラス (%2d): %s\n",
errcode,DOSerr_class_msg[errcode] ) ;
}
/* 詳細情報 : エラーアクション */
errcode = INT24err.action ;
if ( errcode > NDOSerr_action_msg || errcode < 0 ) {
errcode = NDOSerr_action_msg ;
TEXT_printf( " エラー対処(%2d): %s\n",
INT24err.action,DOSerr_action_msg[errcode] ) ;
} else {
TEXT_printf( " エラー対処(%2d): %s\n",
errcode,DOSerr_action_msg[errcode] ) ;
}
/* 詳細情報 : エラーローカス */
errcode = INT24err.locus ;
if ( errcode > NDOSerr_locus_msg || errcode < 0 ) {
errcode = NDOSerr_locus_msg ;
TEXT_printf( " エラー場所(%2d): %s\n",
INT24err.locus,DOSerr_locus_msg[errcode] ) ;
} else {
TEXT_printf( " エラー場所(%2d): %s\n",
errcode,DOSerr_locus_msg[errcode] ) ;
}
/*
** 致命的エラーに対しどうするか?
*/
TEXT_color( C_HYELLOW ) ;
TEXT_printf( "\n<A>:中止, <R>:再試行, <I>:無視 ? " ) ;
while ( TRUE ) {
moji.x = KYB_read( 0,(unsigned int *)&encode ) ;
if ( moji.hl.l == 'a' || moji.hl.l == 'A' ) {
act = INT24_ABORT ;
break ;
} else if ( moji.hl.l == 'r' || moji.hl.l == 'R' ) {
act = INT24_RETRY ;
break ;
} else if ( moji.hl.l == 'i' || moji.hl.l == 'I' ) {
act = INT24_IGNORE ;
break ;
}
}
TEXT_color( C_WHITE ) ;
TEXT_printf( "\n\n" ) ;
/*
** 致命的エラーに対する処理を設定する
*/
switch ( act ) {
case INT24_RETRY :
case INT24_ABORT :
case INT24_FAIL :
ax = ( ax & 0xFF00 ) + act ;
break ;
case INT24_IGNORE :
ax = ( ax & 0xFF00 ) + INT24_FAIL ;
}
return( ax ) ;
}
/********************************* 初期化 **********************************/
void ginit()
{
TEXT_init( Gwork,GworkSize ) ; /* EGB 初期化 */
GRP_viewport( 0,0,1023,511 ) ; /* View Port SET */
GRP_writePage( 1 ) ;
EGB_clearScreen( Gwork ) ;
EGB_displayPage( Gwork,0,3 ) ; /* Show page 0 & 1 : Priority 0 */
TEXT_cursor( TRUE ) ; /* カーソル表示 */
TEXT_color( C_WHITE ) ;
/* TEXTcrflg = TRUE ;*/
}
/***************************** ★ メイン ★ ********************************/
void main( int ac,char *av[] )
{
struct _ENCODE encode ;
union _MOJI moji ;
FILE *fp ;
char buf[MAXCOLM+1] ;
int c ;
int err = FALSE ;
ginit() ; /* EGB 初期化 */
INT24_entry = critical_handler ;
INT24_init() ; /* INT23h/INT24h設定 */
if ( ac > 1 ) { /* 引数あり */
if ( (fp=fopen( av[1],"r" )) == NULL ) {
TEXT_printf( "can't open input file : %s\n",av[1] ) ;
err = TRUE ;
}
} else { /* 引数なし */
TEXT_printf( "データファイル名を指定して下さい!\n" ) ;
err = TRUE ;
}
if ( !err ) {
TEXTtabs = 4 ;
TEXT_color( C_HGREEN ) ;
TEXT_printf( "FILE: %s\n",av[1] ) ;
TEXT_color( C_WHITE ) ;
c = 0 ;
while ( fgets(buf,sizeof(buf),fp) != NULL ) {
c ++ ;
TEXT_printf( "%s",buf ) ;
}
TEXT_printf( "[EOF]\n\n全部で %d 行のデータを読みました.\n",c ) ;
fclose( fp ) ;
}
KYB_clrbuf() ; /* バッファクリア */
TEXT_color( C_HGREEN ) ;
TEXT_printf( "\n何かキーを押して下さい。 " ) ;
moji.x = KYB_read( 0,(unsigned int *)&encode ) ;
/*
** コンソール画面に戻す
*/
EGB_init( Gwork,GworkSize ) ; /* ゴミを消すため EGB 初期化 */
EGB_clearScreen( Gwork ) ;
coninit() ;
}